// 声明对象类型

let person1: { name: string, age: number }

person1 = { name: 'tom', age: 18 }
// person1 = { name: 900, age: 18 }    // 警告: 不能将类型“number”分配给类型“string”。
// person1 = { name: 'tom' }   // 警告: 类型 "{ name: string; }" 中缺少属性 "age"，但类型 "{ name: string; age: number; }" 中需要该属性。

let person2: { name: string, age?: number }

person2 = { name: 'tom' }
person2 = { name: 'tom', age: 18 }

// 分号分隔
let person3: { name: string; age?: number }

// 回车分隔
let person4: {
  name: string
  age?: number
}

// person1 = { name: 'tom', age: 18, gender: '男' }  // 警告: 对象字面量只能指定已知属性，并且“gender”不在类型“{ name: string; age: number; }”中。

let person: {
  name: string
  age?: number
  [key: string]: any  // 索引签名, 完全可以不用 key 这个单词, 换成其他的也可以. 一般使用(key, k, index, i)
}

person = { name: 'tom', age: 18, gender: '男', city: '北京' }

// 声明函数类型

let count: (a: number, b: number) => number   // count 变量只能存储 (a: number, b: number) => number 形式的函数; a 和 b 也是形式, 可以是任意值

// 类型限定多余
count = function (a: number, b: number): number {
  return a + b
}

count = function (x, y) {
  return x + y
}

count = (a, b) => a + b

// 声明数组类型

let arr1: string[]
let arr2: Array<number>

arr1 = ['a', 'b', 'c']
arr2 = [100, 200]

console.log(arr1)
console.log(arr2)
